using System;
using System.Collections.Generic;
using System.Text;
using Entidades;
using DataAccessArquitectura;
using System.Data;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

/*
 * Nombre archivo: usuariosBuilder.cs 
 *
 * Descripcion: Manipulacion de la tabla usuarios, con los metodos de consulta, grabado, actulaizacion
 * y recuperacion de un registro
 *
 * Autor: PLUS-EW
 * Fecha: 01/01/2001 17:11:41
 *
 * Historial
 * ---------------------------------------------------------
 * Autor            Fecha               Modificación
 *
 */

namespace Reglas_Negocio
{
	public class usuariosBuilder
	{
		private const enmTipoBaseDatos mTipoBD = enmTipoBaseDatos.MySQL;

		#region < METODOS PUBLICOS CONSULTA >
		public static DataTable ListarTodos()
		{
			try
			{
				return ListarTodos("");
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public static DataTable ListarTodos(string filtro)
		{
			DataTable r = new DataTable();
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				r = bd.EjecutarSelectDs("*", "usuarios", filtro).Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}
		public static bool Existe(string filtro)
		{
			int numero = 0;
			bool r = false;
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				numero = Convert.ToInt32(bd.EjecutarSelectScalar("COUNT(*)", "usuarios", filtro));
				r = (numero > 0);
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}
		#endregion

		#region < METODOS PUBLICOS GRABADO >
		public static bool GrabarViaProcedimiento(usuarios datos)
		{
			int numero = 0;
			bool r = false;
			string filtro = "";
			try
			{
				string strConectionInsert = "INSERT INTO usuarios (nombre_usu,clave_usu,id_emp_fk,rol_usu) VALUES (?nombre_usu,?clave_usu,?id_emp_fk,?rol_usu);";
				string strConectionUpdate = "UPDATE usuarios SET nombre_usu = ?nombre_usu,clave_usu = ?clave_usu,id_emp_fk = ?id_emp_fk,rol_usu = ?rol_usu WHERE id_usu=?id_usu;";

				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				MySqlParameter psqlId_usu = new MySqlParameter("?id_usu", MySqlDbType.Int32);
				MySqlParameter psqlNombre_usu = new MySqlParameter("?nombre_usu", MySqlDbType.VarChar,20);
				MySqlParameter psqlClave_usu = new MySqlParameter("?clave_usu", MySqlDbType.VarChar,20);
				MySqlParameter psqlId_emp_fk = new MySqlParameter("?id_emp_fk", MySqlDbType.Int32);
				MySqlParameter psqlRol_usu = new MySqlParameter("?rol_usu", MySqlDbType.VarChar,20);

				psqlId_usu.Value = datos.Id_usu;
				psqlNombre_usu.Value = datos.Nombre_usu;
				psqlClave_usu.Value = datos.Clave_usu;
				psqlId_emp_fk.Value = datos.Id_emp_fk;
				psqlRol_usu.Value = datos.Rol_usu;

				if (!Existe("id_usu=" + datos.Id_usu))
				{
					numero = bd.EjecutarProcedimientoMySQL(strConectionInsert
							, psqlId_usu
							, psqlNombre_usu
							, psqlClave_usu
							, psqlId_emp_fk
							, psqlRol_usu
							);
					MessageBox.Show("Se grabo [usuarios] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
				else
				{
					numero = bd.EjecutarProcedimientoMySQL(strConectionUpdate
							, psqlId_usu
							, psqlNombre_usu
							, psqlClave_usu
							, psqlId_emp_fk
							, psqlRol_usu
							);
					MessageBox.Show("Se actualizó [usuarios] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
				r = (numero < 0);
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static void GrabarViaSql(usuarios datos)
		{
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				string filtro = string.Format("id_usu='{0}'", datos.Id_usu);
				if (!Existe(filtro))
				{
					bd.EjecutarInsert("usuarios"
						, new CampoValor("nombre_usu", datos.Nombre_usu)
						, new CampoValor("clave_usu", datos.Clave_usu)
						, new CampoValor("id_emp_fk", datos.Id_emp_fk.ToString())
						, new CampoValor("rol_usu", datos.Rol_usu)
						);
					MessageBox.Show("Se grabo [usuarios] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
				else
				{
					bd.EjecutarUpdate("usuarios", filtro
						, new CampoValor("nombre_usu", datos.Nombre_usu)
						, new CampoValor("clave_usu", datos.Clave_usu)
						, new CampoValor("id_emp_fk", datos.Id_emp_fk.ToString())
						, new CampoValor("rol_usu", datos.Rol_usu)
						);
					MessageBox.Show("Se actualizó [usuarios] exitosamente....","Información",MessageBoxButtons.OK,MessageBoxIcon.Information);
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		#endregion

		#region < METODOS PUBLICOS RECUPERACION >
		public static usuarios Recuperar(string filtro)
		{
			usuarios r = new usuarios();
			try
			{
				if (Existe(filtro))
				{
					DataTable ds = ListarTodos(filtro);
					r.Id_usu = Convert.ToInt32(ds.Rows[0]["id_usu"]);
					if (ds.Rows[0]["nombre_usu"] != System.DBNull.Value)
						r.Nombre_usu = ds.Rows[0]["nombre_usu"].ToString();
					if (ds.Rows[0]["nombre_usu"] == System.DBNull.Value)
						r.Nombre_usu = "";
					if (ds.Rows[0]["clave_usu"] != System.DBNull.Value)
						r.Clave_usu = ds.Rows[0]["clave_usu"].ToString();
					if (ds.Rows[0]["clave_usu"] == System.DBNull.Value)
						r.Clave_usu = "";
					r.Id_emp_fk = Convert.ToInt32(ds.Rows[0]["id_emp_fk"]);
					if (ds.Rows[0]["rol_usu"] != System.DBNull.Value)
						r.Rol_usu = ds.Rows[0]["rol_usu"].ToString();
					if (ds.Rows[0]["rol_usu"] == System.DBNull.Value)
						r.Rol_usu = "";
                    //r.Empresa = empresaBuilder.Recuperar("id_empr=" + ds.Rows[0]["id_emp_fk"]);
					r.Empleados = empleadosBuilder.Recuperar("id_emp=" + ds.Rows[0]["id_emp_fk"]);
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}
		#endregion

		#region < METODOS PUBLICOS BORRADO >
		public static void Borrar(string filtro)
		{
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				bd.EjecutarDelete("usuarios", filtro);
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public static void BorrarTodos()
		{
			try
			{
				Borrar("");
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		#endregion

		#region < METODOS PUBLICOS EXTRAS >
		public static void Listar_Combobox(ComboBox cmbusuarios, string filtro, string nombre_display)
		{
			cmbusuarios.DataSource = ListarTodos(filtro);
			cmbusuarios.DisplayMember = nombre_display;
			cmbusuarios.ValueMember = "id_usu";
		}

		public static DataTable ListarTodos_Alias(string filtro)
		{
			DataTable r = new DataTable();
			try
			{
				ArquitecturaDB bd = new ArquitecturaDB(mTipoBD);
				r = bd.EjecutarSelectDs("id_usu AS ID,nombre_usu AS Usuario,rol_usu AS Rol", "usuarios", filtro).Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static List<usuarios> ListarTodos_List(string filtro)
		{
			List<usuarios> r = new List<usuarios>();
			try
			{
				DataTable dt = ListarTodos(filtro);
				for (int i = 0; i < dt.Rows.Count; i++)
					r.Add(Recuperar("id_usu="+dt.Rows[i]["id_usu"]));
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static DataTable ListarTodos_Joins_Empresa(string filtro)
		{
			DataTable r = new DataTable();
			string joins_ = "";
			try
			{
				if(filtro=="")
					joins_ = "usuarios.id_emp_fk = empresa.id_empr";
				else
					joins_ = "usuarios.id_emp_fk = empresa.id_empr AND " + filtro;
				r = ValidarBuilder.ListarTodos(joins_, "usuarios, empresa","*").Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static DataTable ListarTodos_Joins_Empresa_Alias(string filtro)
		{
			DataTable r = new DataTable();
			string joins_ = "";
			string campos_ = "usuarios.id_usu AS usuarios.id_usu,usuarios.nombre_usu AS usuarios.nombre_usu,usuarios.clave_usu AS usuarios.clave_usu,usuarios.id_emp_fk AS usuarios.id_emp_fk,usuarios.rol_usu AS usuarios.rol_usu," + 
							 "empresa.id_empr AS empresa.id_empr,empresa.ruc_empr AS empresa.ruc_empr,empresa.nombre_empr AS empresa.nombre_empr,empresa.direccion_empr AS empresa.direccion_empr,empresa.telefono_empr AS empresa.telefono_empr,empresa.email_empr AS empresa.email_empr,empresa.encargado_empr AS empresa.encargado_empr,empresa.logo_empr AS empresa.logo_empr,empresa.ciudad_empr AS empresa.ciudad_empr,empresa.tipo_empr AS empresa.tipo_empr";
			try
			{
				if(filtro=="")
					joins_ = "usuarios.id_emp_fk = empresa.id_empr";
				else
					joins_ = "usuarios.id_emp_fk = empresa.id_empr AND " + filtro;
				r = ValidarBuilder.ListarTodos(joins_, "usuarios, empresa",campos_).Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static DataTable ListarTodos_Joins_Empleados(string filtro)
		{
			DataTable r = new DataTable();
			string joins_ = "";
			try
			{
				if(filtro=="")
					joins_ = "usuarios.id_emp_fk = empleados.id_emp";
				else
					joins_ = "usuarios.id_emp_fk = empleados.id_emp AND " + filtro;
				r = ValidarBuilder.ListarTodos(joins_, "usuarios, empleados","*").Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static DataTable ListarTodos_Joins_Empleados_Alias(string filtro)
		{
			DataTable r = new DataTable();
			string joins_ = "";
			string campos_ = "usuarios.id_usu AS usuarios.id_usu,usuarios.nombre_usu AS usuarios.nombre_usu,usuarios.clave_usu AS usuarios.clave_usu,usuarios.id_emp_fk AS usuarios.id_emp_fk,usuarios.rol_usu AS usuarios.rol_usu," + 
							 "empleados.id_emp AS empleados.id_emp,empleados.cedula_emp AS empleados.cedula_emp,empleados.nombre_emp AS empleados.nombre_emp,empleados.apellido_emp AS empleados.apellido_emp,empleados.direccion_emp AS empleados.direccion_emp,empleados.telefono_emp AS empleados.telefono_emp,empleados.id_cat_cargo AS empleados.id_cat_cargo,empleados.genero_emp AS empleados.genero_emp,empleados.id_cat_nivel_acad AS empleados.id_cat_nivel_acad,empleados.fecha_nac_emp AS empleados.fecha_nac_emp,empleados.fecha_contrato_emp AS empleados.fecha_contrato_emp,empleados.id_cat_estado_civil_emp AS empleados.id_cat_estado_civil_emp,empleados.cargas_familiares_emp AS empleados.cargas_familiares_emp,empleados.foto_emp AS empleados.foto_emp,empleados.id_cat_doc_identificacion AS empleados.id_cat_doc_identificacion,empleados.fecha_salida_emp AS empleados.fecha_salida_emp,empleados.estado_emp AS empleados.estado_emp,empleados.cat_jor_id_fk_emp AS empleados.cat_jor_id_fk_emp,empleados.id_empr_fk AS empleados.id_empr_fk,empleados.nro_horas_ingreso AS empleados.nro_horas_ingreso,empleados.nro_horas_atraso AS empleados.nro_horas_atraso";
			try
			{
				if(filtro=="")
					joins_ = "usuarios.id_emp_fk = empleados.id_emp";
				else
					joins_ = "usuarios.id_emp_fk = empleados.id_emp AND " + filtro;
				r = ValidarBuilder.ListarTodos(joins_, "usuarios, empleados",campos_).Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static DataTable ListarTodos_Joins(string filtro)
		{
			DataTable r = new DataTable();
			string joins_ = "";
			try
			{
				if(filtro=="")
					joins_ = "usuarios.id_emp_fk = empresa.id_empr AND usuarios.id_emp_fk = empleados.id_emp ";
				else
					joins_ = "usuarios.id_emp_fk = empresa.id_empr AND usuarios.id_emp_fk = empleados.id_emp AND  " + filtro;
				r = ValidarBuilder.ListarTodos(joins_, "empresa,empleados,usuarios","*").Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		public static DataTable ListarTodos_Joins_Alias(string filtro)
		{
			DataTable r = new DataTable();
			string joins_ = "";
			string campos_ = "usuarios.id_usu AS usuarios.id_usu,usuarios.nombre_usu AS usuarios.nombre_usu,usuarios.clave_usu AS usuarios.clave_usu,usuarios.id_emp_fk AS usuarios.id_emp_fk,usuarios.rol_usu AS usuarios.rol_usu," + 
							 "empresa.id_empr AS empresa.id_empr,empresa.ruc_empr AS empresa.ruc_empr,empresa.nombre_empr AS empresa.nombre_empr,empresa.direccion_empr AS empresa.direccion_empr,empresa.telefono_empr AS empresa.telefono_empr,empresa.email_empr AS empresa.email_empr,empresa.encargado_empr AS empresa.encargado_empr,empresa.logo_empr AS empresa.logo_empr,empresa.ciudad_empr AS empresa.ciudad_empr,empresa.tipo_empr AS empresa.tipo_empr," + 
							 "empleados.id_emp AS empleados.id_emp,empleados.cedula_emp AS empleados.cedula_emp,empleados.nombre_emp AS empleados.nombre_emp,empleados.apellido_emp AS empleados.apellido_emp,empleados.direccion_emp AS empleados.direccion_emp,empleados.telefono_emp AS empleados.telefono_emp,empleados.id_cat_cargo AS empleados.id_cat_cargo,empleados.genero_emp AS empleados.genero_emp,empleados.id_cat_nivel_acad AS empleados.id_cat_nivel_acad,empleados.fecha_nac_emp AS empleados.fecha_nac_emp,empleados.fecha_contrato_emp AS empleados.fecha_contrato_emp,empleados.id_cat_estado_civil_emp AS empleados.id_cat_estado_civil_emp,empleados.cargas_familiares_emp AS empleados.cargas_familiares_emp,empleados.foto_emp AS empleados.foto_emp,empleados.id_cat_doc_identificacion AS empleados.id_cat_doc_identificacion,empleados.fecha_salida_emp AS empleados.fecha_salida_emp,empleados.estado_emp AS empleados.estado_emp,empleados.cat_jor_id_fk_emp AS empleados.cat_jor_id_fk_emp,empleados.id_empr_fk AS empleados.id_empr_fk,empleados.nro_horas_ingreso AS empleados.nro_horas_ingreso,empleados.nro_horas_atraso AS empleados.nro_horas_atraso";
			try
			{
				if(filtro=="")
					joins_ = "usuarios.id_emp_fk = empresa.id_empr AND usuarios.id_emp_fk = empleados.id_emp ";
				else
					joins_ = "usuarios.id_emp_fk = empresa.id_empr AND usuarios.id_emp_fk = empleados.id_emp AND  " + filtro;
				r = ValidarBuilder.ListarTodos(joins_, "empresa,empleados,usuarios",campos_).Tables[0];
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return r;
		}

		#endregion

		#region < METODOS PUBLICOS VALIDACION >
		public static usuarios valida_campos_usuarios(Control ctrl_id_usu,TextBox txt_nombre_usu,TextBox txt_clave_usu,Control ctrl_id_emp_fk,TextBox txt_rol_usu)
		{
			bool r = true;
			usuarios new_usuarios = new usuarios();
			try
			{
				if(ctrl_id_usu.GetType().Equals(typeof(TextBox)))
				{
					TextBox txt_id_usu = (TextBox)ctrl_id_usu;
					if (txt_id_usu.TextLength == 0)
					{
						r = false;
						MessageBox.Show("Falta ingresar el/la id_usu","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
					}
					else
					{
						if (Convert.ToInt32(txt_id_usu.Text) == 0)
						{
							r = false;
							MessageBox.Show("Falta ingresar el/la id_usu","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
						}
					}
					if (r)
						new_usuarios.Id_usu = Convert.ToInt32(txt_id_usu.Text);
				}
				if(ctrl_id_usu.GetType().Equals(typeof(ComboBox)))
				{
					ComboBox cmb_id_usu = (ComboBox)ctrl_id_usu;
					if (cmb_id_usu.SelectedIndex == -1)
					{
						r = false;
						MessageBox.Show("Falta ingresar el/la id_usu","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
					}
					if (r)
						new_usuarios.Id_usu = Convert.ToInt32(cmb_id_usu.SelectedValue);
				}
				if (txt_nombre_usu.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la nombre_usu","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_usuarios.Nombre_usu = txt_nombre_usu.Text;
				if (txt_clave_usu.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la clave_usu","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_usuarios.Clave_usu = txt_clave_usu.Text;
				if(ctrl_id_emp_fk.GetType().Equals(typeof(TextBox)))
				{
					TextBox txt_id_emp_fk = (TextBox)ctrl_id_emp_fk;
					if (txt_id_emp_fk.TextLength == 0)
					{
						r = false;
						MessageBox.Show("Falta ingresar el/la id_emp_fk","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
					}
					else
					{
						if (Convert.ToInt32(txt_id_emp_fk.Text) == 0)
						{
							r = false;
							MessageBox.Show("Falta ingresar el/la id_emp_fk","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
						}
					}
					if (r)
						new_usuarios.Id_emp_fk = Convert.ToInt32(txt_id_emp_fk.Text);
				}
				if(ctrl_id_emp_fk.GetType().Equals(typeof(ComboBox)))
				{
					ComboBox cmb_id_emp_fk = (ComboBox)ctrl_id_emp_fk;
					if (cmb_id_emp_fk.SelectedIndex == -1)
					{
						r = false;
						MessageBox.Show("Falta ingresar el/la id_emp_fk","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
					}
					if (r)
						new_usuarios.Id_emp_fk = Convert.ToInt32(cmb_id_emp_fk.SelectedValue);
				}
				if (txt_rol_usu.TextLength == 0)
				{
					r = false;
					MessageBox.Show("Falta ingresar el/la rol_usu","Información",MessageBoxButtons.OK,MessageBoxIcon.Stop);
				}
				if (r)
					new_usuarios.Rol_usu = txt_rol_usu.Text;

				if(!r)
					new_usuarios = null;
			}
			catch (Exception ex)
			{
				throw ex;
			}
			return new_usuarios;
		}

		public static void grabar_actualizar_registro(Control ctrl_id_usu,TextBox txt_nombre_usu,TextBox txt_clave_usu,Control ctrl_id_emp_fk,TextBox txt_rol_usu)
		{
			try
			{
				usuarios new_usuarios =valida_campos_usuarios(ctrl_id_usu,txt_nombre_usu,txt_clave_usu,ctrl_id_emp_fk,txt_rol_usu); 
				if(new_usuarios!=null)
					GrabarViaSql(new_usuarios);
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		#endregion

	}
}
